{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 遗传算法求解TSP问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "N_CITIES = 20           # 城市数量\n",
    "CROSS_RATE = 0.5        # 交叉概率\n",
    "MUTATE_RATE = 0.10      # 变异概率\n",
    "POP_SIZE = 500          # 种群概率\n",
    "N_GENERATIONS = 500     # 迭代次数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## GA类\n",
    "\n",
    "通过面向对象的方法构建了遗传算法迭代类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "class GA(object):\n",
    "    def __init__(self, DNA_size, cross_rate, mutation_rate, pop_size, ):\n",
    "        self.DNA_size = DNA_size\n",
    "        self.cross_rate = cross_rate\n",
    "        self.mutate_rate = mutation_rate\n",
    "        self.pop_size = pop_size\n",
    "\n",
    "        self.pop = np.vstack([np.random.permutation(DNA_size) for _ in range(pop_size)])\n",
    "\n",
    "    def translateDNA(self, DNA, city_position):         # 获得排序后的城市坐标\n",
    "        line_x = np.empty_like(DNA, dtype=np.float64)\n",
    "        line_y = np.empty_like(DNA, dtype=np.float64)\n",
    "        for i, d in enumerate(DNA):\n",
    "            city_coord = city_position[d]\n",
    "            line_x[i, :] = city_coord[:, 0]\n",
    "            line_y[i, :] = city_coord[:, 1]\n",
    "        return line_x, line_y\n",
    "\n",
    "    def get_fitness(self, line_x, line_y):\n",
    "        total_distance = np.empty((line_x.shape[0],), dtype=np.float64)\n",
    "        for i, (xs, ys) in enumerate(zip(line_x, line_y)):\n",
    "            total_distance[i] = np.sum(np.sqrt(np.square(np.diff(xs)) + np.square(np.diff(ys))))\n",
    "        fitness = np.exp(self.DNA_size * 2 / total_distance)    # 把欧氏距离的影响扩大化\n",
    "        return fitness, total_distance\n",
    "\n",
    "    def select(self, fitness):\n",
    "        idx = np.random.choice(np.arange(self.pop_size), size=self.pop_size, replace=True, p=fitness / fitness.sum())\n",
    "        return self.pop[idx]\n",
    "\n",
    "    def crossover(self, parent, pop):\n",
    "        if np.random.rand() < self.cross_rate:\n",
    "            i_ = np.random.randint(0, self.pop_size, size=1)                        # 从pop中选择另外一个个体\n",
    "            cross_points = np.random.randint(0, 2, self.DNA_size).astype(np.bool)   # 选择交叉点\n",
    "            keep_city = parent[~cross_points]                                       # 找到城市的编号\n",
    "            swap_city = pop[i_, np.isin(pop[i_].ravel(), keep_city, invert=True)]\n",
    "            parent[:] = np.concatenate((keep_city, swap_city))\n",
    "        return parent\n",
    "\n",
    "    def mutate(self, child):\n",
    "        for point in range(self.DNA_size):\n",
    "            if np.random.rand() < self.mutate_rate:\n",
    "                swap_point = np.random.randint(0, self.DNA_size)\n",
    "                swapA, swapB = child[point], child[swap_point]\n",
    "                child[point], child[swap_point] = swapB, swapA\n",
    "        return child\n",
    "\n",
    "    def evolve(self, fitness):\n",
    "        pop = self.select(fitness)\n",
    "        pop_copy = pop.copy()\n",
    "        for parent in pop:  # 遍历每个父代\n",
    "            child = self.crossover(parent, pop_copy)\n",
    "            child = self.mutate(child)\n",
    "            parent[:] = child\n",
    "        self.pop = pop"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "class TravelSalesPerson(object):\n",
    "    def __init__(self, n_cities):\n",
    "        self.city_position = np.random.rand(n_cities, 2)\n",
    "        plt.ion()\n",
    "\n",
    "    def plotting(self, lx, ly, total_d):\n",
    "        plt.cla()\n",
    "        plt.scatter(self.city_position[:, 0].T, self.city_position[:, 1].T, s=100, c='k')\n",
    "        plt.plot(lx.T, ly.T, 'r-')\n",
    "        plt.text(-0.05, -0.05, \"总里程=%.2f\" % total_d, fontdict={'size': 20, 'color': 'red'})\n",
    "        plt.xlim((-0.1, 1.1))\n",
    "        plt.ylim((-0.1, 1.1))\n",
    "        plt.pause(0.01)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "Gen: 0 | best fit: 127.60\nGen: 1 | best fit: 149.06\nGen: 2 | best fit: 219.71\nGen: 3 | best fit: 154.03\nGen: 4 | best fit: 177.95\nGen: 5 | best fit: 197.66\nGen: 6 | best fit: 212.90\nGen: 7 | best fit: 322.11\nGen: 8 | best fit: 317.41\nGen: 9 | best fit: 327.43\nGen: 10 | best fit: 327.43\nGen: 11 | best fit: 372.52\nGen: 12 | best fit: 287.63\nGen: 13 | best fit: 295.48\nGen: 14 | best fit: 304.66\nGen: 15 | best fit: 443.36\nGen: 16 | best fit: 430.85\nGen: 17 | best fit: 430.85\nGen: 18 | best fit: 430.85\nGen: 19 | best fit: 430.85\nGen: 20 | best fit: 430.85\nGen: 21 | best fit: 444.82\nGen: 22 | best fit: 430.85\nGen: 23 | best fit: 521.84\nGen: 24 | best fit: 569.73\nGen: 25 | best fit: 569.73\nGen: 26 | best fit: 656.28\nGen: 27 | best fit: 569.73\nGen: 28 | best fit: 432.50\nGen: 29 | best fit: 426.27\nGen: 30 | best fit: 410.84\nGen: 31 | best fit: 517.97\nGen: 32 | best fit: 534.80\nGen: 33 | best fit: 608.46\nGen: 34 | best fit: 615.66\nGen: 35 | best fit: 608.46\nGen: 36 | best fit: 584.84\nGen: 37 | best fit: 553.83\nGen: 38 | best fit: 553.83\nGen: 39 | best fit: 493.96\nGen: 40 | best fit: 684.18\nGen: 41 | best fit: 684.18\nGen: 42 | best fit: 742.45\nGen: 43 | best fit: 1122.24\nGen: 44 | best fit: 752.83\nGen: 45 | best fit: 844.98\nGen: 46 | best fit: 1537.07\nGen: 47 | best fit: 1537.07\nGen: 48 | best fit: 1591.86\nGen: 49 | best fit: 1591.86\nGen: 50 | best fit: 1811.97\nGen: 51 | best fit: 1811.97\nGen: 52 | best fit: 1077.73\nGen: 53 | best fit: 1077.73\nGen: 54 | best fit: 1077.73\nGen: 55 | best fit: 1077.73\nGen: 56 | best fit: 1077.73\nGen: 57 | best fit: 1813.26\nGen: 58 | best fit: 1813.26\nGen: 59 | best fit: 2036.39\nGen: 60 | best fit: 2751.66\nGen: 61 | best fit: 2813.16\nGen: 62 | best fit: 2813.16\nGen: 63 | best fit: 2813.16\nGen: 64 | best fit: 2836.02\nGen: 65 | best fit: 2836.02\nGen: 66 | best fit: 3271.40\nGen: 67 | best fit: 3271.40\n"
    },
    {
     "output_type": "error",
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-24-bfdeafd15da0>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      5\u001b[0m     \u001b[0mlx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mly\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mga\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtranslateDNA\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mga\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0menv\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcity_position\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m#city_position（x,y）\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      6\u001b[0m     \u001b[0mfitness\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtotal_distance\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mga\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_fitness\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mly\u001b[0m\u001b[1;33m)\u001b[0m    \u001b[1;31m#根据获得的路径计算路程\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 7\u001b[1;33m     \u001b[0mga\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mevolve\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfitness\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      8\u001b[0m     \u001b[0mbest_idx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0margmax\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfitness\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      9\u001b[0m     \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Gen:'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgeneration\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'| best fit: %.2f'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mfitness\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mbest_idx\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m<ipython-input-22-11a0f27a313b>\u001b[0m in \u001b[0;36mevolve\u001b[1;34m(self, fitness)\u001b[0m\n\u001b[0;32m     49\u001b[0m         \u001b[0mpop_copy\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpop\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     50\u001b[0m         \u001b[1;32mfor\u001b[0m \u001b[0mparent\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mpop\u001b[0m\u001b[1;33m:\u001b[0m  \u001b[1;31m# 遍历每个父代\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 51\u001b[1;33m             \u001b[0mchild\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcrossover\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mparent\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpop_copy\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     52\u001b[0m             \u001b[0mchild\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmutate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mchild\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     53\u001b[0m             \u001b[0mparent\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mchild\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m<ipython-input-22-11a0f27a313b>\u001b[0m in \u001b[0;36mcrossover\u001b[1;34m(self, parent, pop)\u001b[0m\n\u001b[0;32m     34\u001b[0m             \u001b[0mkeep_city\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mparent\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m~\u001b[0m\u001b[0mcross_points\u001b[0m\u001b[1;33m]\u001b[0m                                       \u001b[1;31m# 找到城市的编号\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     35\u001b[0m             \u001b[0mswap_city\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpop\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi_\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0misin\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpop\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi_\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkeep_city\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minvert\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 36\u001b[1;33m             \u001b[0mparent\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconcatenate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkeep_city\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mswap_city\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     37\u001b[0m         \u001b[1;32mreturn\u001b[0m \u001b[0mparent\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     38\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m<__array_function__ internals>\u001b[0m in \u001b[0;36mconcatenate\u001b[1;34m(*args, **kwargs)\u001b[0m\n",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "ga = GA(DNA_size=N_CITIES, cross_rate=CROSS_RATE, mutation_rate=MUTATE_RATE, pop_size=POP_SIZE)\n",
    "\n",
    "env = TravelSalesPerson(N_CITIES)\n",
    "for generation in range(N_GENERATIONS):\n",
    "    lx, ly = ga.translateDNA(ga.pop, env.city_position) #city_position（x,y）\n",
    "    fitness, total_distance = ga.get_fitness(lx, ly)    #根据获得的路径计算路程\n",
    "    ga.evolve(fitness)\n",
    "    best_idx = np.argmax(fitness)\n",
    "    print('Gen:', generation, '| best fit: %.2f' % fitness[best_idx],)\n",
    "    \n",
    "    # 绘制迭代过程\n",
    "    # env.plotting(lx[best_idx], ly[best_idx], total_distance[best_idx])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/svg+xml": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\r\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n<!-- Created with matplotlib (https://matplotlib.org/) -->\r\n<svg height=\"248.518125pt\" version=\"1.1\" viewBox=\"0 0 372.103125 248.518125\" width=\"372.103125pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n <metadata>\r\n  <rdf:RDF xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\r\n   <cc:Work>\r\n    <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\r\n    <dc:date>2020-07-26T19:49:45.316033</dc:date>\r\n    <dc:format>image/svg+xml</dc:format>\r\n    <dc:creator>\r\n     <cc:Agent>\r\n      <dc:title>Matplotlib v3.3.0, https://matplotlib.org/</dc:title>\r\n     </cc:Agent>\r\n    </dc:creator>\r\n   </cc:Work>\r\n  </rdf:RDF>\r\n </metadata>\r\n <defs>\r\n  <style type=\"text/css\">*{stroke-linecap:butt;stroke-linejoin:round;}</style>\r\n </defs>\r\n <g id=\"figure_1\">\r\n  <g id=\"patch_1\">\r\n   <path d=\"M 0 248.518125 \r\nL 372.103125 248.518125 \r\nL 372.103125 0 \r\nL 0 0 \r\nz\r\n\" style=\"fill:none;\"/>\r\n  </g>\r\n  <g id=\"axes_1\">\r\n   <g id=\"patch_2\">\r\n    <path d=\"M 30.103125 224.64 \r\nL 364.903125 224.64 \r\nL 364.903125 7.2 \r\nL 30.103125 7.2 \r\nz\r\n\" style=\"fill:#ffffff;\"/>\r\n   </g>\r\n   <g id=\"PathCollection_1\">\r\n    <defs>\r\n     <path d=\"M 0 5 \r\nC 1.326016 5 2.597899 4.473168 3.535534 3.535534 \r\nC 4.473168 2.597899 5 1.326016 5 0 \r\nC 5 -1.326016 4.473168 -2.597899 3.535534 -3.535534 \r\nC 2.597899 -4.473168 1.326016 -5 0 -5 \r\nC -1.326016 -5 -2.597899 -4.473168 -3.535534 -3.535534 \r\nC -4.473168 -2.597899 -5 -1.326016 -5 0 \r\nC -5 1.326016 -4.473168 2.597899 -3.535534 3.535534 \r\nC -2.597899 4.473168 -1.326016 5 0 5 \r\nz\r\n\" id=\"m3c23447d52\" style=\"stroke:#000000;\"/>\r\n    </defs>\r\n    <g clip-path=\"url(#p0e6c45c64e)\">\r\n     <use style=\"stroke:#000000;\" x=\"245.544871\" xlink:href=\"#m3c23447d52\" y=\"100.701755\"/>\r\n     <use style=\"stroke:#000000;\" x=\"285.889205\" xlink:href=\"#m3c23447d52\" y=\"79.925199\"/>\r\n     <use style=\"stroke:#000000;\" x=\"249.39578\" xlink:href=\"#m3c23447d52\" y=\"188.013128\"/>\r\n     <use style=\"stroke:#000000;\" x=\"303.069949\" xlink:href=\"#m3c23447d52\" y=\"35.926626\"/>\r\n     <use style=\"stroke:#000000;\" x=\"104.492412\" xlink:href=\"#m3c23447d52\" y=\"101.617165\"/>\r\n     <use style=\"stroke:#000000;\" x=\"330.418968\" xlink:href=\"#m3c23447d52\" y=\"99.746073\"/>\r\n     <use style=\"stroke:#000000;\" x=\"108.58643\" xlink:href=\"#m3c23447d52\" y=\"146.468268\"/>\r\n     <use style=\"stroke:#000000;\" x=\"243.705925\" xlink:href=\"#m3c23447d52\" y=\"63.260342\"/>\r\n     <use style=\"stroke:#000000;\" x=\"76.276667\" xlink:href=\"#m3c23447d52\" y=\"140.348446\"/>\r\n     <use style=\"stroke:#000000;\" x=\"191.866676\" xlink:href=\"#m3c23447d52\" y=\"133.779922\"/>\r\n     <use style=\"stroke:#000000;\" x=\"296.703136\" xlink:href=\"#m3c23447d52\" y=\"42.596508\"/>\r\n     <use style=\"stroke:#000000;\" x=\"131.787007\" xlink:href=\"#m3c23447d52\" y=\"187.472132\"/>\r\n     <use style=\"stroke:#000000;\" x=\"176.484592\" xlink:href=\"#m3c23447d52\" y=\"90.999358\"/>\r\n     <use style=\"stroke:#000000;\" x=\"70.105332\" xlink:href=\"#m3c23447d52\" y=\"64.607481\"/>\r\n     <use style=\"stroke:#000000;\" x=\"131.376992\" xlink:href=\"#m3c23447d52\" y=\"30.769892\"/>\r\n     <use style=\"stroke:#000000;\" x=\"94.747612\" xlink:href=\"#m3c23447d52\" y=\"113.612325\"/>\r\n     <use style=\"stroke:#000000;\" x=\"336.34409\" xlink:href=\"#m3c23447d52\" y=\"182.143916\"/>\r\n     <use style=\"stroke:#000000;\" x=\"230.460852\" xlink:href=\"#m3c23447d52\" y=\"125.163116\"/>\r\n     <use style=\"stroke:#000000;\" x=\"134.484575\" xlink:href=\"#m3c23447d52\" y=\"110.302062\"/>\r\n     <use style=\"stroke:#000000;\" x=\"87.580711\" xlink:href=\"#m3c23447d52\" y=\"108.576476\"/>\r\n    </g>\r\n   </g>\r\n   <g id=\"matplotlib.axis_1\">\r\n    <g id=\"xtick_1\">\r\n     <g id=\"line2d_1\">\r\n      <defs>\r\n       <path d=\"M 0 0 \r\nL 0 3.5 \r\n\" id=\"m7669d00875\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n      </defs>\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"58.003125\" xlink:href=\"#m7669d00875\" y=\"224.64\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_1\">\r\n      <!-- 0.0 -->\r\n      <g transform=\"translate(50.051563 239.238437)scale(0.1 -0.1)\">\r\n       <defs>\r\n        <path d=\"M 31.78125 66.40625 \r\nQ 24.171875 66.40625 20.328125 58.90625 \r\nQ 16.5 51.421875 16.5 36.375 \r\nQ 16.5 21.390625 20.328125 13.890625 \r\nQ 24.171875 6.390625 31.78125 6.390625 \r\nQ 39.453125 6.390625 43.28125 13.890625 \r\nQ 47.125 21.390625 47.125 36.375 \r\nQ 47.125 51.421875 43.28125 58.90625 \r\nQ 39.453125 66.40625 31.78125 66.40625 \r\nz\r\nM 31.78125 74.21875 \r\nQ 44.046875 74.21875 50.515625 64.515625 \r\nQ 56.984375 54.828125 56.984375 36.375 \r\nQ 56.984375 17.96875 50.515625 8.265625 \r\nQ 44.046875 -1.421875 31.78125 -1.421875 \r\nQ 19.53125 -1.421875 13.0625 8.265625 \r\nQ 6.59375 17.96875 6.59375 36.375 \r\nQ 6.59375 54.828125 13.0625 64.515625 \r\nQ 19.53125 74.21875 31.78125 74.21875 \r\nz\r\n\" id=\"DejaVuSans-48\"/>\r\n        <path d=\"M 10.6875 12.40625 \r\nL 21 12.40625 \r\nL 21 0 \r\nL 10.6875 0 \r\nz\r\n\" id=\"DejaVuSans-46\"/>\r\n       </defs>\r\n       <use xlink:href=\"#DejaVuSans-48\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"xtick_2\">\r\n     <g id=\"line2d_2\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"113.803125\" xlink:href=\"#m7669d00875\" y=\"224.64\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_2\">\r\n      <!-- 0.2 -->\r\n      <g transform=\"translate(105.851563 239.238437)scale(0.1 -0.1)\">\r\n       <defs>\r\n        <path d=\"M 19.1875 8.296875 \r\nL 53.609375 8.296875 \r\nL 53.609375 0 \r\nL 7.328125 0 \r\nL 7.328125 8.296875 \r\nQ 12.9375 14.109375 22.625 23.890625 \r\nQ 32.328125 33.6875 34.8125 36.53125 \r\nQ 39.546875 41.84375 41.421875 45.53125 \r\nQ 43.3125 49.21875 43.3125 52.78125 \r\nQ 43.3125 58.59375 39.234375 62.25 \r\nQ 35.15625 65.921875 28.609375 65.921875 \r\nQ 23.96875 65.921875 18.8125 64.3125 \r\nQ 13.671875 62.703125 7.8125 59.421875 \r\nL 7.8125 69.390625 \r\nQ 13.765625 71.78125 18.9375 73 \r\nQ 24.125 74.21875 28.421875 74.21875 \r\nQ 39.75 74.21875 46.484375 68.546875 \r\nQ 53.21875 62.890625 53.21875 53.421875 \r\nQ 53.21875 48.921875 51.53125 44.890625 \r\nQ 49.859375 40.875 45.40625 35.40625 \r\nQ 44.1875 33.984375 37.640625 27.21875 \r\nQ 31.109375 20.453125 19.1875 8.296875 \r\nz\r\n\" id=\"DejaVuSans-50\"/>\r\n       </defs>\r\n       <use xlink:href=\"#DejaVuSans-48\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-50\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"xtick_3\">\r\n     <g id=\"line2d_3\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"169.603125\" xlink:href=\"#m7669d00875\" y=\"224.64\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_3\">\r\n      <!-- 0.4 -->\r\n      <g transform=\"translate(161.651563 239.238437)scale(0.1 -0.1)\">\r\n       <defs>\r\n        <path d=\"M 37.796875 64.3125 \r\nL 12.890625 25.390625 \r\nL 37.796875 25.390625 \r\nz\r\nM 35.203125 72.90625 \r\nL 47.609375 72.90625 \r\nL 47.609375 25.390625 \r\nL 58.015625 25.390625 \r\nL 58.015625 17.1875 \r\nL 47.609375 17.1875 \r\nL 47.609375 0 \r\nL 37.796875 0 \r\nL 37.796875 17.1875 \r\nL 4.890625 17.1875 \r\nL 4.890625 26.703125 \r\nz\r\n\" id=\"DejaVuSans-52\"/>\r\n       </defs>\r\n       <use xlink:href=\"#DejaVuSans-48\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-52\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"xtick_4\">\r\n     <g id=\"line2d_4\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"225.403125\" xlink:href=\"#m7669d00875\" y=\"224.64\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_4\">\r\n      <!-- 0.6 -->\r\n      <g transform=\"translate(217.451563 239.238437)scale(0.1 -0.1)\">\r\n       <defs>\r\n        <path d=\"M 33.015625 40.375 \r\nQ 26.375 40.375 22.484375 35.828125 \r\nQ 18.609375 31.296875 18.609375 23.390625 \r\nQ 18.609375 15.53125 22.484375 10.953125 \r\nQ 26.375 6.390625 33.015625 6.390625 \r\nQ 39.65625 6.390625 43.53125 10.953125 \r\nQ 47.40625 15.53125 47.40625 23.390625 \r\nQ 47.40625 31.296875 43.53125 35.828125 \r\nQ 39.65625 40.375 33.015625 40.375 \r\nz\r\nM 52.59375 71.296875 \r\nL 52.59375 62.3125 \r\nQ 48.875 64.0625 45.09375 64.984375 \r\nQ 41.3125 65.921875 37.59375 65.921875 \r\nQ 27.828125 65.921875 22.671875 59.328125 \r\nQ 17.53125 52.734375 16.796875 39.40625 \r\nQ 19.671875 43.65625 24.015625 45.921875 \r\nQ 28.375 48.1875 33.59375 48.1875 \r\nQ 44.578125 48.1875 50.953125 41.515625 \r\nQ 57.328125 34.859375 57.328125 23.390625 \r\nQ 57.328125 12.15625 50.6875 5.359375 \r\nQ 44.046875 -1.421875 33.015625 -1.421875 \r\nQ 20.359375 -1.421875 13.671875 8.265625 \r\nQ 6.984375 17.96875 6.984375 36.375 \r\nQ 6.984375 53.65625 15.1875 63.9375 \r\nQ 23.390625 74.21875 37.203125 74.21875 \r\nQ 40.921875 74.21875 44.703125 73.484375 \r\nQ 48.484375 72.75 52.59375 71.296875 \r\nz\r\n\" id=\"DejaVuSans-54\"/>\r\n       </defs>\r\n       <use xlink:href=\"#DejaVuSans-48\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-54\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"xtick_5\">\r\n     <g id=\"line2d_5\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"281.203125\" xlink:href=\"#m7669d00875\" y=\"224.64\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_5\">\r\n      <!-- 0.8 -->\r\n      <g transform=\"translate(273.251563 239.238437)scale(0.1 -0.1)\">\r\n       <defs>\r\n        <path d=\"M 31.78125 34.625 \r\nQ 24.75 34.625 20.71875 30.859375 \r\nQ 16.703125 27.09375 16.703125 20.515625 \r\nQ 16.703125 13.921875 20.71875 10.15625 \r\nQ 24.75 6.390625 31.78125 6.390625 \r\nQ 38.8125 6.390625 42.859375 10.171875 \r\nQ 46.921875 13.96875 46.921875 20.515625 \r\nQ 46.921875 27.09375 42.890625 30.859375 \r\nQ 38.875 34.625 31.78125 34.625 \r\nz\r\nM 21.921875 38.8125 \r\nQ 15.578125 40.375 12.03125 44.71875 \r\nQ 8.5 49.078125 8.5 55.328125 \r\nQ 8.5 64.0625 14.71875 69.140625 \r\nQ 20.953125 74.21875 31.78125 74.21875 \r\nQ 42.671875 74.21875 48.875 69.140625 \r\nQ 55.078125 64.0625 55.078125 55.328125 \r\nQ 55.078125 49.078125 51.53125 44.71875 \r\nQ 48 40.375 41.703125 38.8125 \r\nQ 48.828125 37.15625 52.796875 32.3125 \r\nQ 56.78125 27.484375 56.78125 20.515625 \r\nQ 56.78125 9.90625 50.3125 4.234375 \r\nQ 43.84375 -1.421875 31.78125 -1.421875 \r\nQ 19.734375 -1.421875 13.25 4.234375 \r\nQ 6.78125 9.90625 6.78125 20.515625 \r\nQ 6.78125 27.484375 10.78125 32.3125 \r\nQ 14.796875 37.15625 21.921875 38.8125 \r\nz\r\nM 18.3125 54.390625 \r\nQ 18.3125 48.734375 21.84375 45.5625 \r\nQ 25.390625 42.390625 31.78125 42.390625 \r\nQ 38.140625 42.390625 41.71875 45.5625 \r\nQ 45.3125 48.734375 45.3125 54.390625 \r\nQ 45.3125 60.0625 41.71875 63.234375 \r\nQ 38.140625 66.40625 31.78125 66.40625 \r\nQ 25.390625 66.40625 21.84375 63.234375 \r\nQ 18.3125 60.0625 18.3125 54.390625 \r\nz\r\n\" id=\"DejaVuSans-56\"/>\r\n       </defs>\r\n       <use xlink:href=\"#DejaVuSans-48\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-56\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"xtick_6\">\r\n     <g id=\"line2d_6\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"337.003125\" xlink:href=\"#m7669d00875\" y=\"224.64\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_6\">\r\n      <!-- 1.0 -->\r\n      <g transform=\"translate(329.051563 239.238437)scale(0.1 -0.1)\">\r\n       <defs>\r\n        <path d=\"M 12.40625 8.296875 \r\nL 28.515625 8.296875 \r\nL 28.515625 63.921875 \r\nL 10.984375 60.40625 \r\nL 10.984375 69.390625 \r\nL 28.421875 72.90625 \r\nL 38.28125 72.90625 \r\nL 38.28125 8.296875 \r\nL 54.390625 8.296875 \r\nL 54.390625 0 \r\nL 12.40625 0 \r\nz\r\n\" id=\"DejaVuSans-49\"/>\r\n       </defs>\r\n       <use xlink:href=\"#DejaVuSans-49\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n   </g>\r\n   <g id=\"matplotlib.axis_2\">\r\n    <g id=\"ytick_1\">\r\n     <g id=\"line2d_7\">\r\n      <defs>\r\n       <path d=\"M 0 0 \r\nL -3.5 0 \r\n\" id=\"m45575467dd\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n      </defs>\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"30.103125\" xlink:href=\"#m45575467dd\" y=\"206.52\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_7\">\r\n      <!-- 0.0 -->\r\n      <g transform=\"translate(7.2 210.319219)scale(0.1 -0.1)\">\r\n       <use xlink:href=\"#DejaVuSans-48\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"ytick_2\">\r\n     <g id=\"line2d_8\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"30.103125\" xlink:href=\"#m45575467dd\" y=\"170.28\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_8\">\r\n      <!-- 0.2 -->\r\n      <g transform=\"translate(7.2 174.079219)scale(0.1 -0.1)\">\r\n       <use xlink:href=\"#DejaVuSans-48\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-50\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"ytick_3\">\r\n     <g id=\"line2d_9\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"30.103125\" xlink:href=\"#m45575467dd\" y=\"134.04\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_9\">\r\n      <!-- 0.4 -->\r\n      <g transform=\"translate(7.2 137.839219)scale(0.1 -0.1)\">\r\n       <use xlink:href=\"#DejaVuSans-48\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-52\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"ytick_4\">\r\n     <g id=\"line2d_10\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"30.103125\" xlink:href=\"#m45575467dd\" y=\"97.8\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_10\">\r\n      <!-- 0.6 -->\r\n      <g transform=\"translate(7.2 101.599219)scale(0.1 -0.1)\">\r\n       <use xlink:href=\"#DejaVuSans-48\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-54\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"ytick_5\">\r\n     <g id=\"line2d_11\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"30.103125\" xlink:href=\"#m45575467dd\" y=\"61.56\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_11\">\r\n      <!-- 0.8 -->\r\n      <g transform=\"translate(7.2 65.359219)scale(0.1 -0.1)\">\r\n       <use xlink:href=\"#DejaVuSans-48\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-56\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n    <g id=\"ytick_6\">\r\n     <g id=\"line2d_12\">\r\n      <g>\r\n       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"30.103125\" xlink:href=\"#m45575467dd\" y=\"25.32\"/>\r\n      </g>\r\n     </g>\r\n     <g id=\"text_12\">\r\n      <!-- 1.0 -->\r\n      <g transform=\"translate(7.2 29.119219)scale(0.1 -0.1)\">\r\n       <use xlink:href=\"#DejaVuSans-49\"/>\r\n       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\r\n      </g>\r\n     </g>\r\n    </g>\r\n   </g>\r\n   <g id=\"line2d_13\">\r\n    <path clip-path=\"url(#p0e6c45c64e)\" d=\"M 230.460852 125.163116 \r\nL 191.866676 133.779922 \r\nL 134.484575 110.302062 \r\nL 176.484592 90.999358 \r\nL 131.376992 30.769892 \r\nL 70.105332 64.607481 \r\nL 104.492412 101.617165 \r\nL 94.747612 113.612325 \r\nL 87.580711 108.576476 \r\nL 76.276667 140.348446 \r\nL 108.58643 146.468268 \r\nL 131.787007 187.472132 \r\nL 249.39578 188.013128 \r\nL 336.34409 182.143916 \r\nL 330.418968 99.746073 \r\nL 285.889205 79.925199 \r\nL 245.544871 100.701755 \r\nL 243.705925 63.260342 \r\nL 296.703136 42.596508 \r\nL 303.069949 35.926626 \r\n\" style=\"fill:none;stroke:#ff0000;stroke-linecap:square;stroke-width:1.5;\"/>\r\n   </g>\r\n   <g id=\"patch_3\">\r\n    <path d=\"M 30.103125 224.64 \r\nL 30.103125 7.2 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n   </g>\r\n   <g id=\"patch_4\">\r\n    <path d=\"M 364.903125 224.64 \r\nL 364.903125 7.2 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n   </g>\r\n   <g id=\"patch_5\">\r\n    <path d=\"M 30.103125 224.64 \r\nL 364.903125 224.64 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n   </g>\r\n   <g id=\"patch_6\">\r\n    <path d=\"M 30.103125 7.2 \r\nL 364.903125 7.2 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n   </g>\r\n   <g id=\"text_13\">\r\n    <!-- 总里程=4.16 -->\r\n    <g style=\"fill:#ff0000;\" transform=\"translate(44.053125 215.58)scale(0.2 -0.2)\">\r\n     <defs>\r\n      <path d=\"M 4.984375 -17.671875 \r\nL 4.984375 70.515625 \r\nL 54.984375 70.515625 \r\nL 54.984375 -17.671875 \r\nz\r\nM 10.59375 -12.109375 \r\nL 49.421875 -12.109375 \r\nL 49.421875 64.890625 \r\nL 10.59375 64.890625 \r\nz\r\n\" id=\"DejaVuSans-24635\"/>\r\n      <path d=\"M 4.984375 -17.671875 \r\nL 4.984375 70.515625 \r\nL 54.984375 70.515625 \r\nL 54.984375 -17.671875 \r\nz\r\nM 10.59375 -12.109375 \r\nL 49.421875 -12.109375 \r\nL 49.421875 64.890625 \r\nL 10.59375 64.890625 \r\nz\r\n\" id=\"DejaVuSans-37324\"/>\r\n      <path d=\"M 4.984375 -17.671875 \r\nL 4.984375 70.515625 \r\nL 54.984375 70.515625 \r\nL 54.984375 -17.671875 \r\nz\r\nM 10.59375 -12.109375 \r\nL 49.421875 -12.109375 \r\nL 49.421875 64.890625 \r\nL 10.59375 64.890625 \r\nz\r\n\" id=\"DejaVuSans-31243\"/>\r\n      <path d=\"M 10.59375 45.40625 \r\nL 73.1875 45.40625 \r\nL 73.1875 37.203125 \r\nL 10.59375 37.203125 \r\nz\r\nM 10.59375 25.484375 \r\nL 73.1875 25.484375 \r\nL 73.1875 17.1875 \r\nL 10.59375 17.1875 \r\nz\r\n\" id=\"DejaVuSans-61\"/>\r\n     </defs>\r\n     <use xlink:href=\"#DejaVuSans-24635\"/>\r\n     <use x=\"60.009766\" xlink:href=\"#DejaVuSans-37324\"/>\r\n     <use x=\"120.019531\" xlink:href=\"#DejaVuSans-31243\"/>\r\n     <use x=\"180.029297\" xlink:href=\"#DejaVuSans-61\"/>\r\n     <use x=\"263.818359\" xlink:href=\"#DejaVuSans-52\"/>\r\n     <use x=\"327.441406\" xlink:href=\"#DejaVuSans-46\"/>\r\n     <use x=\"359.228516\" xlink:href=\"#DejaVuSans-49\"/>\r\n     <use x=\"422.851562\" xlink:href=\"#DejaVuSans-54\"/>\r\n    </g>\r\n   </g>\r\n  </g>\r\n </g>\r\n <defs>\r\n  <clipPath id=\"p0e6c45c64e\">\r\n   <rect height=\"217.44\" width=\"334.8\" x=\"30.103125\" y=\"7.2\"/>\r\n  </clipPath>\r\n </defs>\r\n</svg>\r\n",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     }
    }
   ],
   "source": [
    "# 绘制最终的结果图形  \n",
    "env.plotting(lx[best_idx], ly[best_idx], total_distance[best_idx])\n",
    "plt.ioff()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.8.4 64-bit",
   "language": "python",
   "name": "python38464bit1416437edcaf49af8e39476b27d510d7"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.4-final"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}